home *** CD-ROM | disk | FTP | other *** search
- #include "speech.proto.h"
- #include "menu_resrcdefs.h"
- #include "rsdefs.h"
- #include <Gestalt.h>
- #include <Menus.h>
- #include <Speech.h>
-
-
- Boolean gCanSpeak = false;
- short gNumberVoices = 0;
- short gSelectedVoiceIndex = 0;
- short gSpeakingVoiceIndex = 0;
- VoiceSpec ** gVoices = nil;
-
-
- Boolean BuildSpeechMenu(MenuHandle voicesMenu)
- {
- OSErr err = noErr;
-
- do {
- long speechAttr;
- VoiceDescription defaultVoiceInfo;
- short v;
-
- /* Is everything already set up? */
-
- if (gCanSpeak) {
- break;
- }
-
- /* Is there a menu to build on? */
-
- if (nil == voicesMenu) {
- break;
- }
-
- /* Is the Speech Manager present? */
-
- err = Gestalt(gestaltSpeechAttr, &speechAttr);
- if (noErr != err || !((1L << gestaltSpeechMgrPresent) & speechAttr)) {
- break;
- }
-
- /* How many voices are there? */
-
- err = CountVoices(&gNumberVoices);
- if (noErr != err || 0 >= gNumberVoices) {
- break;
- }
-
- /* get the VoiceSpec for the default voice */
-
- err = GetVoiceDescription(nil, &defaultVoiceInfo, sizeof(defaultVoiceInfo));
- if (noErr != err) {
- err = MakeVoiceSpec('\0\0\0\0', '\0\0\0\0', &defaultVoiceInfo.voice);
- }
-
- /* Allocate space to store all the voices */
-
- if (nil != gVoices) {
- DisposeHandle((Handle)gVoices);
- }
- gVoices = (VoiceSpec **)myNewHandle(gNumberVoices * sizeof(**gVoices));
- if (nil == gVoices) {
- err = MemError();
- break;
- }
-
- MoveHHi((Handle)gVoices);
- HLock((Handle)gVoices);
-
- /* for every voice */
-
- for (v = 0; v < gNumberVoices; v++) {
- VoiceDescription info;
-
- /* get the VoiceSpec for the voice */
-
- err = GetIndVoice(v + 1, &(*gVoices)[v]);
- if (noErr != err) {
- break;
- }
-
- /* get the description (name, etc.) for the voice */
-
- err = GetVoiceDescription(&(*gVoices)[v], &info, sizeof(info));
- if (noErr != err) {
- break;
- }
-
- /* Add it to the menu */
-
- AppendMenu(voicesMenu, info.name);
-
- /* Is it the default voice? */
-
- if (EqualVoiceSpec(&(*gVoices)[v], &defaultVoiceInfo.voice)) {
- gSelectedVoiceIndex = v;
- }
- }
-
- gCanSpeak = v == gNumberVoices;
-
- } while (false);
-
- if (gCanSpeak) {
- short cmdChar = '\0';
-
- /* Unlock the gVoices array */
-
- HUnlock((Handle)gVoices);
-
- /* Get rid of Command H for send erase character */
-
- GetItemCmd(myMenus[Net], NEec, &cmdChar);
- if ('H' == cmdChar) {
- SetItemCmd(myMenus[Net], NEec, '\0');
- }
-
- /* and set up the speech menu */
-
- gSpeakingVoiceIndex = gNumberVoices;
- AdjustSpeechMenu(gSpeakSelectionEnabled);
-
- } else {
- if (nil != gVoices) {
- DisposeHandle((Handle)gVoices);
- gVoices = nil;
- }
- DoSpeechError(err);
- }
-
- return gCanSpeak;
-
- }
-